/*
 * Copyright (c) 2013-2015 Charkey. All rights reserved.
 *
 * This software is the confidential and proprietary information of Charkey.
 * You shall not disclose such Confidential Information and shall use it only
 * in accordance with the terms of the agreements you entered into with Charkey.
 *
 * Charkey MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
 *
 * Charkey SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
 * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 */

package cn.simastudio.talos.inter.mapper.inst;

import cn.simastudio.talos.inter.model.inst.DemoCountry;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Usage: DemoCountryMapper
 *
 * @author Charkey
 * @date 2015/4/28 14:51
 */
public interface DemoCountryMapper {

    /**
     * 根据主键id删除记录
     *
     * @param id 主键id
     * @return 此操作影响了多少条数据库记录（一般 删除成功为1）
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * 将对象保存，返回的int是影响的数据记录数（一般为1）<br/>
     * 对象保存之后，可以通过<b>getId()</b>得到插入到数据库的记录ID
     *
     * @param record 将要保存的对象
     * @return 此操作影响的数据记录数（一般为1）
     */
    int insert(DemoCountry record);

    /**
     * 保存对象之前，会判断字段是否有值，如果有值再拼接到SQL中
     * 将对象保存，返回的int是影响的数据记录数（一般为1）<br/>
     * 对象保存之后，可以通过<b>getId()</b>得到插入到数据库的记录ID
     *
     * @param record 将要保存的对象
     * @return 此操作影响的数据记录数（一般为1）
     */
    int insertSelective(DemoCountry record);

    /**
     * 根据主键ID查询，返回DemoCountry对象
     *
     * @param id 主键ID
     * @return DemoCountry
     */
    DemoCountry selectByPrimaryKey(Integer id);

    /**
     * 根据主键ID查询，返回HashMap，key为列名，value为字段值
     *
     * @param id 主键ID
     * @return HashMap(String, Object)
     */
    HashMap<String, Object> selectByPrimaryKeyReturnMap(Integer id);

    /**
     * 更新数据：不为空的字段都会出现在sql中
     *
     * @param record 待更新到数据库的数据对象
     * @return 此操作影响的数据库记录数
     */
    int updateByPrimaryKeySelective(DemoCountry record);

    /**
     * 更新数据：所有字段都会出现在sql中
     *
     * @param record 待更新到数据库的数据对象
     * @return 此操作影响的数据库记录数
     */
    int updateByPrimaryKey(DemoCountry record);

    /**
     * Like模糊查询
     *
     * @param countryName 模糊查询的字段值
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectByNameLike(String countryName);

    /**
     * Like模糊查询：直接在sql中拼接上limit参数，目前写死
     *
     * @param countryName 模糊查询的字段值
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectByNameLikeTraditional(String countryName);

    /**
     * Like模糊查询，获得总数：直接在sql中拼接上limit参数，目前写死
     *
     * @param countryName 模糊查询的字段值
     * @return List<DemoCountry>
     */
    Integer selectByNameLikeTraditionalCount(String countryName);

    /**
     * 注解方式，${order}是直接赋值，在排序的地方使用时，需要用$而不是#
     * ${orderBy}，可以理解为需要传入一个map，key为orderBy，value为其值，@Param注解可以实现此目标
     *
     * @param orderBy 排序字段
     * @return List<DemoCountry>
     */
    @Select("select * from demo_country order by ${orderBy}")
    @ResultMap("BaseResultMap")
    List<DemoCountry> selectByOrder(@Param("orderBy") String orderBy);

    /**
     * ${order}是直接赋值，在排序的地方使用时，需要用$而不是#
     * ${orderBy}，可以理解为需要传入一个map，key为orderBy，value为其值，@Param注解可以实现此目标
     *
     * @param orderBy 排序字段
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectByOrder2(@Param("orderBy") String orderBy);

    /**
     * 根据传入的字段名，动态完成sql查询；如只传如country_name，则只会select country_name from ...
     *
     * @param columns 字段名，可选；如为空，则select *，否则，select指定字段
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectOptionalColumns(@Param("columns") String... columns);

    /**
     * 查询不在ids（id列表）中的记录，并且支持
     *
     * @param ids     id列表
     * @param orderBy 排序字段，可选
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectNotInIds(@Param("ids") List<Integer> ids, @Param("orderBy") String orderBy);

    /**
     * 传入map，动态完成sql查询
     *
     * @param paramMap key-value key为字段名，value为值
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectByWhereMap(@Param("paramMap") Map paramMap);

    /**
     * 查询所有id在入参数组中的记录
     *
     * @param params 主键数组
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectAllIdsInArray(Integer[] params);

    /**
     * 查询所有id在入参列表中的记录
     *
     * @param params 主键数组
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectAllIdsInList(List<Integer> params);

    /**
     * 查询所有id不在入参Map中的记录；未判断是否Map中需要的两个key都有！！！
     *
     * @param paramMap 主键数组：key（id1，id2）
     * @return List<DemoCountry>
     */
    List<DemoCountry> selectAllIdsNotInMap(Map paramMap);

}